//
// Created by 95233 on 2024/5/1.
//

#ifndef AIPLAY_CHESS_H
#define AIPLAY_CHESS_H
// 导入esayx头文件
#import <easyx.h>
#include <vector>
using namespace std;

//表示落子位置
struct ChessPos{
    int row;
    int col;

    explicit ChessPos(int row = 0, int col = 0):row(row),col(col) {

    }
};

typedef enum {
    CHESS_WHITE = -1,//白棋
    CHESS_BLACK = 1,//黑棋
    CHESS_NONE = 0//无棋
} chess_kind_t;//表示棋子类型

class Chess {

public:
    Chess(int gradeSize, int marginX, int marginY, float chessSize);
    //初始化
    void init();
    //判断当前棋子落子是否有效，把有效的位置保存到pos中
    bool clickBoard(int x, int y, ChessPos *pos);

    /**
     * 下棋
     * @param pos：棋盘的指定位置
     * @param kind：落子类型
     */
    void chessDown(ChessPos *pos, chess_kind_t kind);

    // 获取棋盘的大小
    int getGradeSize();

    //获取指定位置是黑旗还是白棋或者无棋
    int getChessData(ChessPos *pos);

    int getChessData(int row, int col);

    //检查棋局是否结束
    bool checkOver();


//使用图形库，显示棋盘，棋子
private:
    IMAGE chessBlackImag;//黑棋图片
    IMAGE chessWhiteImag;//白棋图片

    int gradeSize;//棋盘大小(13,15,17,19)
    int marginX;//棋盘左侧边距
    int marginY;//棋盘顶部边距
    float chessSize;//棋子大小（棋盘小方格大小）
    vector<vector<int>> chessMap;//棋盘数据，存储当前棋局的棋子分布 0：空白 1：黑 -1：白

    bool player;//该谁落子 true:黑 false：白

    void updateGameMap(ChessPos *pos);
    static void putImagePNG(int x, int y, IMAGE* picture);

    bool checkGameState();// 检查游戏是否结束

    ChessPos lastPos; // 最近落子点位置
};

#endif
